import time
from operator import index

import pytest
from selenium.webdriver.common.by import By
from config.config import SMP_URL_DEVICE_MODEL
from page.page_index import index
from common.logger import logger


class Test:
    def setup_class(self):  # 先登录，再去设备型号页面
        logger.info("*** 管理界面——设备型号初始化 ***")
        self.index = index
        self.index.index_login().login("byhy", "sdfsdf")
        self.index.index_devicemodel().find_device_page()

    def teardown_class(self):
        logger.info("*** 管理界面——设备型号结束 ***")
        self.index.close()

    # @pytest.fixture(scope="module")：模块级别，模块执行前执行一次，完成初始操作
    # scope="function"：每引用一次执行一次
    # 用例执行完成之后，恢复到用例执行之前的状态，方便后面的用例执行
    @pytest.fixture(scope="function")
    def delAddDeviceModel(self):
        yield
        # 清除表单第一项内容
        self.index.index_devicemodel().del_frist_item()
        # 刷新页面，为下一条用例进行下一次输入
        self.index.driver.refresh()

    # 添加一个设备型号
    @pytest.fixture(scope="function")
    def addDeviceModel(self):
        # 获取设备型号页面数据
        pageData = self.index.index_devicemodel().get_first_page_device_mode()
        if pageData:  # 当页面有数据时，直接返回，不用添加
            return
        self.index.index_devicemodel().add_device("电瓶车充电站", "elife-canbinlocker-g22-10-20-55",
                                                  "江西南昌瑶湖江西师范大学")
        self.index.driver.refresh()

    # 删除一个设备型号
    @pytest.fixture(scope="function")
    def delDeviceModel(self):
        # 获取设备型号页面数据
        pageData = self.index.index_devicemodel().get_first_page_device_mode()
        if not pageData:  # 当页面没有数据时，添加一条数据
            self.index.index_devicemodel().add_device("电瓶车充电站", "elife-canbinlocker-g22-10-20-55",
                                                      "江西南昌瑶湖江西师范大学")
            self.index.driver.refresh()
            # 添加设备型号后 重新获取页面数据
            pageData = self.index.index_devicemodel().get_first_page_device_mode()
        # 获取页面数据并返回
        yield pageData

    # 添加设备用例。   前置条件：登录成功，并进入设备型号页面，页面内容为空
    @pytest.mark.parametrize("select_val,model_val,desc_val", [
        ("存储柜", "elife-canbinlocker-g22-10-20-40", "南京e生活存储柜-10大20中40小"),
        ("存储柜", "一乙〇丶丨丿乀乁亅二丁十厂匚刂卜八人入儿几九乃了力士土工干于亏亡口囗日曰月木水火土金山石田禾米竹舟车人手足口耳目牙舌齿眉发面头身手足肩背腰腹心肝胆脾肾胃大小多少"
                   "上下前后左右里外远近高低长短粗细胖瘦明暗强弱软硬冷热干湿好坏对错真假善恶美丑是非正反公私对错男女老少高低胖瘦黑白红蓝黄绿青紫橙灰粉棕金银灰褐墨彩春春夏秋冬夏秋秋冬"
                   "东南西北中上下左右前后里外远近高低长短粗细胖瘦明暗强弱软硬冷热干湿好坏对错真假善恶美丑是非正反公私对错男女老少高低胖瘦黑白红蓝黄绿青紫橙灰粉棕金银灰褐墨彩春春夏秋"
                   "冬夏秋秋冬东南西北中上下左右前后里外远近高低长短粗细胖瘦明暗强弱软硬冷热干湿好坏对错真假善恶美丑是非正反公私对错男女老少高低胖瘦黑白红蓝黄绿青紫橙灰粉棕金银灰褐墨彩",
         "杭州滨江区聚光中心C2"),
        ("电瓶车充电站", "bokpower-charger-g22-220v450w", "南京e生活2022款洗车机 2个洗车位"),
    ])
    def test_SMP_device_model_001(self, select_val, model_val, desc_val, delAddDeviceModel):
        logger.info(f"***添加——设备型号***  设备种类：{select_val}")
        # 通过链式访问 获取结果
        dms = self.index.index_devicemodel().add_device(select_val, model_val, desc_val).get_first_page_device_mode()
        # 判断新添加的内容是否为页面第一个元素
        assert dms[0] == [select_val, model_val, desc_val]

    # 修改设备用例    前置条件：已经存在一个  电瓶车充电站 设备型号
    @pytest.mark.parametrize('select_val,model_val,desc_val,a_or_w', [
        ("汽车充电站", "汽车-g22-220v450w", "浙江宁波汽车充电站", 'w'),
        ("洗车站", "洗车-g22-220v450w", "广东深圳宝安洗车站", 'a')
    ])
    def test_SMP_device_model_501(self, addDeviceModel, select_val, model_val, desc_val, a_or_w):
        logger.info(f"***修改——设备型号***  设备种类：{select_val}")
        dms = self.index.index_devicemodel().alter_first_item(select_val, model_val, desc_val,
                                                              a_or_w).get_first_page_device_mode()
        if a_or_w == "w":
            assert dms[0] == [select_val, model_val, desc_val]
        else:
            data = self.index.index_devicemodel()
            assert dms[0] == [select_val,
                              data.get_device_text(By.XPATH, '(//span[@class="field-value"])[2]'),
                              data.get_device_text(By.XPATH, '(//span[@class="field-value"])[3]')]

    # 删除设备用例    前置条件：已经存在一个  电瓶车充电站 设备型号
    def test_SMP_device_model_601(self, delDeviceModel):
        beforeItem = delDeviceModel[0]
        logger.info(f"***删除——设备型号***  设备种类：{beforeItem[0]}")
        self.index.index_devicemodel().del_frist_item()
        afterItem = self.index.index_devicemodel().get_first_page_device_mode()
        if len(afterItem) > 0:  # 新增页面数据 与删除后的页面数据比较
            assert afterItem[0] != [beforeItem[0], beforeItem[1], beforeItem[2]]